package org.service.car.database;

import java.sql.SQLException;
import java.util.List;

import org.service.car.pojo.Categoria;
import org.service.car.pojo.Especialidade;
import org.service.car.pojo.Fornecedor;
import org.service.car.pojo.Item;
import org.service.car.pojo.Revisao;
import org.service.car.pojo.Veiculo;

import android.content.Context;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;

public class Util {

	public static Veiculo getVeiculo(Context context, String nome) {
		Veiculo veiculo = null;
		try {
			DatabaseHelper scdHelper = DatabaseHelper.getHelper(context
					.getApplicationContext());
			Dao<Veiculo, Integer> daoVeiculo = scdHelper.getVeiculoDao();
			QueryBuilder<Veiculo, Integer> veiculoQB = daoVeiculo
					.queryBuilder();
			veiculo = veiculoQB.where().eq(Veiculo.COLUMN_NOME, nome)
					.queryForFirst();
			veiculoQB = null;
			daoVeiculo = null;
			scdHelper = null;
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return veiculo;
	}

	public static Veiculo getVeiculo(Context context, Integer id) {
		Veiculo veiculo = null;
		try {
			DatabaseHelper scdHelper = DatabaseHelper.getHelper(context
					.getApplicationContext());
			veiculo = scdHelper.getVeiculoDao().queryForId(id);
			fecharConexao(context.getApplicationContext());
			return veiculo;
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return veiculo;
	}

	public static List<Revisao> getRevisoesPorVeiculo(Context context,
			String nomeVeiculo) throws SQLException {
		List<Revisao> revisoes = null;
		QueryBuilder<Revisao, Integer> revisaoQB = DatabaseHelper
				.getHelper(context.getApplicationContext()).getRevisaoDao()
				.queryBuilder().orderBy(Revisao.COLUMN_KILOMETRAGEM, true);

		revisoes = revisaoQB
				.where()
				.eq(Revisao.COLUMN_MODELO_ID,
						getVeiculo(context.getApplicationContext(), nomeVeiculo)
								.getModelo().getId()).query();

		for (Revisao r : revisoes)
			r.setItens(getItensRevisao(context.getApplicationContext(), r));

		fecharConexao(context.getApplicationContext());
		return revisoes;
	}

	private static List<Item> getItensRevisao(Context context, Revisao revisao)
			throws SQLException {

		List<Item> itens = null;

		QueryBuilder<Item, Integer> itemQB = DatabaseHelper
				.getHelper(context.getApplicationContext()).getItemDao()
				.queryBuilder();

		itens = itemQB.where().eq(Item.COLUMN_REVISAO_ID, revisao.getId())
				.query();
		fecharConexao(context.getApplicationContext());
		return itens;

	}

	public static List<Especialidade> getEspecialidades(Context context)
			throws SQLException {
		List<Especialidade> especialidades = null;
		especialidades = DatabaseHelper
				.getHelper(context.getApplicationContext())
				.getEspecialidadeDao().queryForAll();
		fecharConexao(context.getApplicationContext());
		return especialidades;
	}

	public static List<Especialidade> getEspecialidadesByFornecedor(
			Context context, Fornecedor fornecedor) throws SQLException {
		List<Especialidade> especialidades;
		QueryBuilder<Especialidade, Integer> especialidadeQB = DatabaseHelper
				.getHelper(context).getEspecialidadeDao().queryBuilder();

		especialidades = especialidadeQB.where().eq(Especialidade.COLUMN_FORNECEDOR_ID,
				fornecedor.getId()).query();
		fecharConexao(context.getApplicationContext());
		return especialidades;

	}
	
	public static List<Especialidade> getEspecialidadesByFornecedor(
			Context context, Categoria categoria) throws SQLException {
		List<Especialidade> especialidades;
		QueryBuilder<Especialidade, Integer> especialidadeQB = DatabaseHelper
				.getHelper(context).getEspecialidadeDao().queryBuilder();

		especialidades = especialidadeQB.where().eq(Especialidade.COLUMN_CATEGORIA_ID,
				categoria.getId()).query();
		fecharConexao(context.getApplicationContext());
		return especialidades;

	}

	public static void fecharConexao(Context context) {
		DatabaseHelper.getHelper(context.getApplicationContext()).close();
	}
	
	public static List<Fornecedor> getAllFornecedorByEspecialidade(Context context, List<Integer> idsCategoria) {
		List<Fornecedor> fornecedores = null;
		try {

			
			QueryBuilder<Especialidade, Integer> especialidadeQB = DatabaseHelper
					.getHelper(context).getEspecialidadeDao().queryBuilder();

			QueryBuilder<Fornecedor, Integer> fornecedorQB = DatabaseHelper
					.getHelper(context).getFornecedorDao().queryBuilder();

			especialidadeQB.selectColumns(Especialidade.COLUMN_FORNECEDOR_ID)
					.where()
					.in(Especialidade.COLUMN_CATEGORIA_ID, idsCategoria);
			 fornecedores = fornecedorQB.where().exists(especialidadeQB).query();
			 
			 fecharConexao(context);

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fornecedores;
	}

}